iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0
Software Development

【今年還是不夠錢買psQQ,不如我們用PyQt自己寫一個】系列 第 22

【沒錢買ps,PyQt自己寫】Day 22 - PyQt 視窗的個性化/屬性控制 setWindowFlags,禁止放大縮小、永遠顯示於最上層/最下層

  • 分享至 

  • xImage
  •  

看完這篇文章你會得到的成果圖

之前內容的重點複習 (前情提要)

我們接下來的討論,會基於讀者已經先讀過我 day5 文章 的架構下去進行程式設計
如果還不清楚我程式設計的邏輯 (UI.py、controller.py、start.py 分別在幹麻)
建議先閱讀 day5 文章後再來閱讀此文。

https://www.wongwonggoods.com/python/pyqt5-5/

此篇文章的範例程式碼 github

視窗的個性化控制 setWindowFlags

這篇文章我們要來討論 PyQt 裡面一個很酷的東西,setWindowFlags,
我們主要要討論的功能都是未來我會用到的功能。

在 setWindowFlags 裡面有很多的定義,

其中有幾個我會用到

顯示於最上層/最下層

  • Qt.WindowStaysOnTopHint: 視窗永遠在最上層,適合互動性高的程式
  • Qt.WindowStaysOnBottomHint: 視窗永遠在最下層,適合背景程式

關於放大/縮小的設定

當我們沒有特別設定參數時,只繼承 「QDialog」 的視窗預設都只會有關閉按鈕。
如果是繼承自 「QWidget」,則縮小、放大、關閉按鈕都會有

  • Qt.WindowMinimizeButtonHint: 顯示最小化按鈕
  • Qt.WindowMaximizeButtonHint: 顯示最大化按鈕
  • Qt.WindowMinMaxButtonsHint: 顯示最小化按鈕和最大化按鈕
  • Qt.WindowCloseButtonHint: 顯示關閉按鈕

這些功能都定義在 PyQt5.QtCore 中,記得要 import !!!

from PyQt5.QtCore import *

搭配上述的使用範例

我們就可以用以下的設定方式,來對視窗做一些特別的控制

  • 只有縮小/關閉 (取消放大)
    • Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint
  • 只有放大/關閉 (取消縮小)
    • Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint
  • 只有關閉 (取消放大縮小)
    • Qt.WindowCloseButtonHint

範例

我們先透過 Qtdesinger 隨便建立一份 UI 介面
並如同之前的方式,建立一個可直接執行的 UI.py

轉換 day22.ui -> UI.py

pyuic5 -x day22.ui -o UI.py

直接打開觀察目前的視窗

我們可以發現目前的視窗中,放大/縮小/關閉的功能都是有的。

觀察目前的程式碼

打開 UI.py,我們發現我們的視窗果然是繼承於「QWidget」
所以預設是縮小、放大、關閉按鈕都會有。

self.centralwidget = QtWidgets.QWidget(MainWindow)

嘗試修改視窗屬性

# 只有縮小/關閉 (取消放大)        
MainWindow.setWindowFlags(Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint)
# 只有放大/關閉 (取消縮小)
# MainWindow.setWindowFlags(Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint)
# 只有關閉 (取消放大縮小)
# MainWindow.setWindowFlags(Qt.WindowCloseButtonHint)
# 視窗永遠在最上層,適合互動性高的程式
# MainWindow.setWindowFlags(Qt.WindowStaysOnTopHint)
# 視窗永遠在最下層,適合背景程式
# MainWindow.setWindowFlags(Qt.WindowStaysOnBottomHint)

# 如果要一起使用,記得都要 | 連接在一起,不然後來的會洗掉之前的

結果

例如我們取消放大的功能,結果如下圖

  • 注意「右上角」反白的「放大」功能。

注意

如果以上的要一起使用(混用),記得都要 | 連接在一起,不然後來的會洗掉之前的

例如,如果我同時想要"取消放大縮小、只留下關閉",且還要視窗永遠在最上層。

我要寫

# 只有縮小/關閉 (取消放大)
# 視窗永遠在最上層,適合互動性高的程式
MainWindow.setWindowFlags(Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint | Qt.WindowStaysOnTopHint)

不能這樣寫 (後者會洗掉前者的功能)

# 只有縮小/關閉 (取消放大)
MainWindow.setWindowFlags(Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint)
# 視窗永遠在最上層,適合互動性高的程式
MainWindow.setWindowFlags(Qt.WindowStaysOnTopHint)

Reference


★ 本文也同步發於我的個人網站(會有內容目錄與顯示各個小節,閱讀起來更流暢):【PyQt5】Day 22 - PyQt 視窗的個性化/屬性控制 setWindowFlags,禁止放大縮小、永遠顯示於最上層/最下層


上一篇
【沒錢買ps,PyQt自己寫】Day 21 - 透過 PyQt 實現滑鼠監聽總整理,完全掌握滑鼠控制 (listen mouse)
下一篇
【沒錢買ps,PyQt自己寫】Day 23 - 使用系統內建的調色盤 QColorDialog,來替我們選擇顏色 QColor (Color Picker)
系列文
【今年還是不夠錢買psQQ,不如我們用PyQt自己寫一個】30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言